Telegram Group & Telegram Channel
💡 Хранимая процедура с секретом – разберешься?

Друзья, всем привет! 👋

Во вторник мы подкинули вам задачку про гибкие параметры хранимых процедур в Oracle. Спасибо всем, кто прислал решение и принял участие в жаркой 🔥 дискуссии! Многие сразу догадались, что речь идёт про ANYDATA. Но главный вопрос: а зачем это вообще нужно на практике? 🤔

У меня есть для вас один интересный кейс, и уже в следующий четверг мы обязательно его обсудим. Следите за анонсами! 📅

А пока разберёмся с ANYDATA и решением задачки.

💡Что такое ANYDATA

Это универсальный контейнер для данных, который позволяет хранить и передавать значения разных типов: строки, числа, коллекции и даже объекты. Это удобно, когда нужно работать с разными структурами данных без жёсткой привязки к конкретному типу.

Когда может быть полезен

🔶 интеграции, API
🔶 EAV-архитектура
🔶 многослойные пользовательские интерфейсы, и т.п.

Основное преимущество для разработчика — отсутствие необходимости хранить метаданные, а также самому реализовывать валидацию и парсинг пользовательских данных. Anydata берет всё это на себя! 🚀

А теперь решение задачки 📚

1️⃣ Процедура с параметром

CREATE OR REPLACE PROCEDURE p_get_anydata_value
(
p_param IN anydata
) IS
l_anytype anytype;
l_typecode PLS_INTEGER;
l_varchar_value VARCHAR2(255 Char);
l_num_value NUMBER;
l_collection t_numbers;
l_status VARCHAR2(64 CHAR);
BEGIN
-- Проверяем тип данных в ANYDATA
l_typecode := p_param.GetType(l_anytype);

IF l_typecode IN (dbms_types.TYPECODE_NAMEDCOLLECTION
,dbms_types.TYPECODE_TABLE) THEN
-- Извлекаем коллекцию
IF p_param.GetCollection(l_collection) = dbms_types.SUCCESS THEN
l_status := 'record_count=' || l_collection.count();
ELSE
l_status := 'ошибка извлечения коллекции';
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_VARCHAR2 THEN
IF p_param.GetVarchar2(l_varchar_value) = dbms_types.SUCCESS THEN
l_status := l_varchar_value;
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_NUMBER THEN
IF p_param.GetNumber(l_num_value) = dbms_types.SUCCESS THEN
l_status := l_num_value;
END IF;
ELSE
l_status := 'неподдерживамый тип параметра';
END IF;
dbms_output.put_line(l_status);
END p_get_anydata_value;
/


2️⃣ Пример вызова

create or replace type t_numbers is table of number;
/

begin
dbms_output.put_line('anydata.ConvertNumber:');
p_get_anydata_value(anydata.ConvertNumber(25));
dbms_output.put_line('anydata.ConvertVarchar2:');
p_get_anydata_value(anydata.ConvertVarchar2('Это строка'));
dbms_output.put_line('anydata.ConvertCollection:');
p_get_anydata_value(anydata.ConvertCollection(t_numbers(1, 2, 3, 4, 5)));
end;
/


3️⃣ Вывод в консоль

anydata.ConvertNumber:
25
anydata.ConvertVarchar2:
Это строка
anydata.ConvertCollection:
record_count=5


🔥 Как вам задачка? Возможно, у вас тоже есть интересные кейсы с ANYDATA? Или вы придумали, как его использовать в своём проекте? Делитесь мнением в нашем чатике 💬

#PLSQL #Oracle #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик 💬
Please open Telegram to view this post
VIEW IN TELEGRAM



tg-me.com/oracle_dbd/849
Create:
Last Update:

💡 Хранимая процедура с секретом – разберешься?

Друзья, всем привет! 👋

Во вторник мы подкинули вам задачку про гибкие параметры хранимых процедур в Oracle. Спасибо всем, кто прислал решение и принял участие в жаркой 🔥 дискуссии! Многие сразу догадались, что речь идёт про ANYDATA. Но главный вопрос: а зачем это вообще нужно на практике? 🤔

У меня есть для вас один интересный кейс, и уже в следующий четверг мы обязательно его обсудим. Следите за анонсами! 📅

А пока разберёмся с ANYDATA и решением задачки.

💡Что такое ANYDATA

Это универсальный контейнер для данных, который позволяет хранить и передавать значения разных типов: строки, числа, коллекции и даже объекты. Это удобно, когда нужно работать с разными структурами данных без жёсткой привязки к конкретному типу.

Когда может быть полезен

🔶 интеграции, API
🔶 EAV-архитектура
🔶 многослойные пользовательские интерфейсы, и т.п.

Основное преимущество для разработчика — отсутствие необходимости хранить метаданные, а также самому реализовывать валидацию и парсинг пользовательских данных. Anydata берет всё это на себя! 🚀

А теперь решение задачки 📚

1️⃣ Процедура с параметром

CREATE OR REPLACE PROCEDURE p_get_anydata_value
(
p_param IN anydata
) IS
l_anytype anytype;
l_typecode PLS_INTEGER;
l_varchar_value VARCHAR2(255 Char);
l_num_value NUMBER;
l_collection t_numbers;
l_status VARCHAR2(64 CHAR);
BEGIN
-- Проверяем тип данных в ANYDATA
l_typecode := p_param.GetType(l_anytype);

IF l_typecode IN (dbms_types.TYPECODE_NAMEDCOLLECTION
,dbms_types.TYPECODE_TABLE) THEN
-- Извлекаем коллекцию
IF p_param.GetCollection(l_collection) = dbms_types.SUCCESS THEN
l_status := 'record_count=' || l_collection.count();
ELSE
l_status := 'ошибка извлечения коллекции';
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_VARCHAR2 THEN
IF p_param.GetVarchar2(l_varchar_value) = dbms_types.SUCCESS THEN
l_status := l_varchar_value;
END IF;
ELSIF l_typecode = dbms_types.TYPECODE_NUMBER THEN
IF p_param.GetNumber(l_num_value) = dbms_types.SUCCESS THEN
l_status := l_num_value;
END IF;
ELSE
l_status := 'неподдерживамый тип параметра';
END IF;
dbms_output.put_line(l_status);
END p_get_anydata_value;
/


2️⃣ Пример вызова

create or replace type t_numbers is table of number;
/

begin
dbms_output.put_line('anydata.ConvertNumber:');
p_get_anydata_value(anydata.ConvertNumber(25));
dbms_output.put_line('anydata.ConvertVarchar2:');
p_get_anydata_value(anydata.ConvertVarchar2('Это строка'));
dbms_output.put_line('anydata.ConvertCollection:');
p_get_anydata_value(anydata.ConvertCollection(t_numbers(1, 2, 3, 4, 5)));
end;
/


3️⃣ Вывод в консоль

anydata.ConvertNumber:
25
anydata.ConvertVarchar2:
Это строка
anydata.ConvertCollection:
record_count=5


🔥 Как вам задачка? Возможно, у вас тоже есть интересные кейсы с ANYDATA? Или вы придумали, как его использовать в своём проекте? Делитесь мнением в нашем чатике 💬

#PLSQL #Oracle #Pavel_Dolganov #задачка

🔗 Канал Oracle Developer | Чатик 💬

BY Oracle Developer👨🏻‍💻




Share with your friend now:
tg-me.com/oracle_dbd/849

View MORE
Open in Telegram


Oracle Developer‍ Telegram | DID YOU KNOW?

Date: |

Telegram hopes to raise $1bn with a convertible bond private placement

The super secure UAE-based Telegram messenger service, developed by Russian-born software icon Pavel Durov, is looking to raise $1bn through a bond placement to a limited number of investors from Russia, Europe, Asia and the Middle East, the Kommersant daily reported citing unnamed sources on February 18, 2021.The issue reportedly comprises exchange bonds that could be converted into equity in the messaging service that is currently 100% owned by Durov and his brother Nikolai.Kommersant reports that the price of the conversion would be at a 10% discount to a potential IPO should it happen within five years.The minimum bond placement is said to be set at $50mn, but could be lowered to $10mn. Five-year bonds could carry an annual coupon of 7-8%.

How To Find Channels On Telegram?

There are multiple ways you can search for Telegram channels. One of the methods is really logical and you should all know it by now. We’re talking about using Telegram’s native search option. Make sure to download Telegram from the official website or update it to the latest version, using this link. Once you’ve installed Telegram, you can simply open the app and use the search bar. Tap on the magnifier icon and search for a channel that might interest you (e.g. Marvel comics). Even though this is the easiest method for searching Telegram channels, it isn’t the best one. This method is limited because it shows you only a couple of results per search.

Oracle Developer‍ from de


Telegram Oracle Developer👨🏻‍💻
FROM USA